#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//int main()
//{
//	int arr[10] = { 1,2,3,4,5 };
//	printf("%p\n", arr);
//	printf("%p\n", &arr[0]);
//	printf("%d\n", *arr);
//	//输出结果
//	return 0;
//}
//int main()
//{
//	int arr[10] = { 0 };
//	printf("%d\n", sizeof(arr));
//
//	return 0;
//}
//void bubble_sort(int arr[], int sz)
//{
//	int flag = 0;
//	int i = 0;
//	for (i = 0; i < sz - 1; i++)
//	{
//		int j = 0;
//		flag = 0;
//		for (j = 0; j < sz - 1 - i; j++)
//		{
//			if (arr[j] > arr[j + 1])
//			{
//				int tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//				flag = 1;
//			}
//		}
//		if (flag == 0)
//		{
//			return;
//		}
//	}
//	return;
//
//}
//
//int main()
//{
//	int arr[10] = { 1,3,5,7,9,2,4,6,8,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//
//	return 0;
//}
////冒泡排序
//数组名该怎么理解？
//数组名通常情况下就是数组首元素的地址
//但是有2个例外：
//1. sizeof(数组名)，数组名单独放在sizeof()内部，这里的数组名表示整个数组，计算的是整个数组的大小
//2. &数组名，这里的数组名也表示整个数组，这里取出的是整个数组的地址
//除此之外所有遇到的数组名都表示数组首元素的地址
//
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6 };
//	printf("%p\n", arr);
//	printf("%p\n", arr + 1);
//
//	printf("%p\n", &arr[0]);
//	printf("%p\n", &arr[0] + 1);
//
//	printf("%p\n", &arr);//数组的地址
//	printf("%p\n", &arr + 1);//+1，跳过整个数组
//
//	//printf("%d\n", sizeof(arr));
//	return 0;
//}
	//int main()
	//{
	//	int arr1[10] = { 0 };
	//	int arr2[10] = { 0 };
	//	int i = 0;


	//	printf("请输入10个数字:>");
	//	for (i = 0; i < 10; i++)
	//	{
	//		scanf("%d", &arr1[i]);
	//	}
	//	printf("请输入10个数字:>");
	//	for (i = 0; i < 10; i++)
	//	{
	//		scanf("%d", &arr2[i]);
	//	}
	//	//交换
	//	for (i = 0; i < 10; i++)
	//	{
	//		int tmp = arr1[i];
	//		arr1[i] = arr2[i];
	//		arr2[i] = tmp;
	//	}

	//	return 0;
	//}

//将数组A中的内容和数组B中的内容进行交换。（数组一样大）
//void Init(int arr[], int sz, int set)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		arr[i] = set;
//	}
//}
//
//
//void Print(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
//
//void Reverse(int arr[], int sz)
//{
//	int left = 0;
//	int right = sz - 1;
//
//
//	while (left < right)
//	{
//		int tmp = arr[left];
//		arr[left] = arr[right];
//		arr[right] = tmp;
//		left++;
//		right--;
//	}
//}
//
//int main()
//{
//	int arry[] = { 0,1,2,3,4,5,6,7,8,9 };
//	int sz = sizeof(arry) / sizeof(arry[0]);
//	Print(arry, sz);
//	Reverse(arry, sz);
//	Print(arry, sz);
//	Init(arry, sz, 0);
//	Print(arry, sz);
//	return 0;
//}

//创建一个整形数组，完成对数组的操作
//
//实现函数init() 初始化数组为全0
//实现print()  打印数组的每个元素
//实现reverse()  函数完成数组元素的逆置。
//要求：自己设计以上函数的参数，返回值。
//int main()
//{
//	//int r = 7 / 2;
//	//printf("%d\n", r);
//	//double d = 7 / 2;
//	//printf("%lf\n", d);//3.5?
//
//
//	//double d = 7.0 / 2.0;
//	//printf("%lf\n", d);//3.5?
//
//	return 0;
//}

//int main()
//{
//	int a = 15;
//	int b = a >> 1;//移动就是a中的2进制信息
//
//	return 0;
//}


//int main()
//{
//	int a = 15;
//	//00000000000000000000000000001111 - 原码
//	//00000000000000000000000000001111 - 反码
//	//00000000000000000000000000001111 - 补码
//
//	int b = -15;
//	//10000000000000000000000000001111 - 原码
//	//11111111111111111111111111110000 - 反码(原码的符号位不变，其他位按位取反得到的就是反码)
//	//11111111111111111111111111110001 - 补码(反码+1就是补码)
//	
//	
//	//整数在内存中存储的是补码
//	//计算的时候也是使用补码计算的
//	return 0;
//}

//int main()
//{
//	int a = -15;
//	int b = a >> 1;
//	printf("%d\n", b);
//	printf("%d\n", a);
//	return 0;
//	//11111111111111111111111111111000(a)-15
//	//10000000000000000000000000000111
//	//10000000000000000000000000001000(a>>1)-8
//}


//int main()
//{
//	int a = 3;
//	//00000000000000000000000000000011 - 补码
//	int b = -5;
//	//10000000000000000000000000000101
//	//11111111111111111111111111111010
//	//11111111111111111111111111111011 - 补码
//	//
//	int c = a & b;
//	//& -- 对应二进制位有0则为0，两个同时为1，才是1
//	//00000000000000000000000000000011
//	//11111111111111111111111111111011
//	//00000000000000000000000000000011 - 补码
//	//
//	printf("%d\n", c);//3
//
//	return 0;
//}

//int main()
//{
//	int a = 3;
//	//00000000000000000000000000000011 - 补码
//	int b = -5;
//	//10000000000000000000000000000101
//	//11111111111111111111111111111010
//	//11111111111111111111111111111011 - 补码
//	//
//	int c = a | b;
//	//| - 按（2进制）位或 - 对应的二进制位有1则为1，两个同时为0才是0
//	//00000000000000000000000000000011
//	//11111111111111111111111111111011
//	//11111111111111111111111111111011 - 补码
//	//11111111111111111111111111111010
//	//10000000000000000000000000000101 - -5
//	printf("%d\n", c);//-5
//
//	return 0;
//}

//int main()
//{
//	int a = 3;
//	//00000000000000000000000000000011 - 补码
//	int b = -5;
//	//10000000000000000000000000000101
//	//11111111111111111111111111111010
//	//11111111111111111111111111111011 - 补码
//	//
//	int c = a ^ b;
//	//^ - 按二进制位异或 -对应的二进制位相同为0，相异为1
//	//00000000000000000000000000000011
//	//11111111111111111111111111111011
//	//11111111111111111111111111111000 - 补码
//	//11111111111111111111111111110111
//	//10000000000000000000000000001000 - -8
//	printf("%d\n", c);//-8
//
//	return 0;
//}

//交换2个整型变量
//不能创建临时变量（第三个变量），实现两个整数的交换

//int main()
//{
//	int a = 3;
//	int b = 5;
//	printf("交换前：a=%d b=%d\n", a, b);
//	/*int tmp = a;
//	a = b;
//	b = tmp;*/
//
//	/*a = a + b;
//	b = a - b;
//	a = a - b;*/
//
//	a = a ^ b;
//	b = a ^ b;//(b = a ^ b ^ b=a)
//	a = a ^ b;//(a = a ^ a ^ b=b)
//
//	printf("交换后：a=%d b=%d\n", a, b);
//	return 0;
////}


//方法1
#include <stdio.h>
int main()
{
	int num = 10;
	int count = 0;//计数
	while (num)
	{
		if (num % 2 == 1)
			count++;
		num = num / 2;
	}
	printf("二进制中1的个数 = %d\n", count);
	return 0;
}
//编写代码实现：求一个整数存储在内存中的二进制中1的个数